package cn.tedu.net.reflection;

import org.junit.Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import static javax.swing.UIManager.get;

//本类用于测试暴力反射
public class TestReflect2 {
    /*定义单元测试方法getField()用来获取属性
    * 获取Person类的字节码对象
    * 获取私有属性
    * */
    @Test
    public void getField() throws Exception {
        Class<Person> clazz = Person.class;
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field.getType().getName());
        }
        System.out.println("*****************");
        Field name = clazz.getDeclaredField("name");
        Field age = clazz.getDeclaredField("age");
        //根据获取到的属性对象获取其类型
        String age1 = age.getType().getName();
        String name1 = name.getType().getName();
        System.out.println(age1);
        System.out.println(name1);
        //设置属性的值 set(m,n)m--给那个对象  n--设置的值
        //通过反射的方式创建对象
        Person p = clazz.newInstance();
        //暴力反射设置私有可见
        name.setAccessible(true);
        age.setAccessible(true);
        //给指定的对象设置值
        name.set(p,"刘德华");
        age.set(p,17);
        System.out.println(name.get(p));
        System.out.println(age.get(p));

    }
    //通过暴力反射获取和设置私有方法
    @Test
    public void getFunction() throws Exception {
        Class<Person> clazz = Person.class;
        Method[] method = clazz.getDeclaredMethods();
        for (Method method1 : method) {
            System.out.println(method1.getName());// update,save
        }
        Method save = clazz.getDeclaredMethod("save", String.class, int.class);
        Method update = clazz.getDeclaredMethod("update");
        //创建对象使用方法
        Person person = clazz.newInstance();
        //获取方法使用权限
        update.setAccessible(true);
        save.setAccessible(true);
        //执行过去到的私有方法save(String,int)
        //invoke(n,x,y,z) n---要执行哪个对象的放法,  x,y,z是方法的参数
        save.invoke(person,"刘德华",17);
        update.invoke(person);
    }
}
